package com.leyou.cart.service;

import com.leyou.cart.pojo.Cart;
import com.leyou.common.constants.UserHolder;
import com.leyou.common.enums.ExceptionEnum;
import com.leyou.common.exception.LyException;
import com.leyou.common.upload.Path;
import com.leyou.common.utils.JsonUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class CartService {
    @Autowired
    private StringRedisTemplate redisTemplate;


    //保存登陆用户的购物车 到redis中
    public void saveCart(Cart cart) {
        try {
            //获取用户id
            Long userId = UserHolder.getUserId();
            //得到当前用户在购物车中的key
            String userKey = Path.USER_CART_KEY_PRE+userId;
            //通过档期那用户的购物车的key 获取到购物车的hashmap
            //参数一 第一个key 参数二 第二个key 参数三 第二个key 对应的值
            //Map<userid,Map<hashkey,cartStr>>
            BoundHashOperations<String, String, String> userCartHash = redisTemplate.boundHashOps(userKey);
            //获取当前新添加的购物车id  skuid
            String hashKey = cart.getSkuId().toString();
            //查找redis中是否存在当前的购物车
            Boolean hash = userCartHash.hasKey(hashKey);
            if(hash){
                //存在 就添加数量
                String json = userCartHash.get(hashKey);
                Cart redisCart = JsonUtils.toBean(json, Cart.class);
                //这里需要合并的是cart 并不是redisCart 提交是 cart
                cart.setNum(redisCart.getNum()+cart.getNum());
            }
            //不存在 就添加新的购物车对象  参数一 第二个key 参数二 ；对应的值
            userCartHash.put(hashKey,JsonUtils.toString(cart));
        } catch (Exception e) {
            throw new LyException(ExceptionEnum.INSERT_OPERATION_FAIL);
        }

    }

    //展示已经登陆的购物车信息
    public List<Cart> findCarts() {
        //获取用户id
        Long userId = UserHolder.getUserId();
        String userKey = Path.USER_CART_KEY_PRE+userId;
        if(!redisTemplate.hasKey(userKey)){
            //不存在用户
            throw new LyException(ExceptionEnum.CARTS_NOT_FOUND);
        }
        BoundHashOperations<String, String, String> hashCart = redisTemplate.boundHashOps(userKey);
        //购物车列表
        Map<String, String> entries = hashCart.entries();
        if(entries.size() == 0){
            //不存在购物车数据
            throw new LyException(ExceptionEnum.CARTS_NOT_FOUND);
        }
        //存在展示 values() 把map集合中的值取出来 弄成一个list
        List<Cart> list = entries.values().stream().
                map(cartStr -> JsonUtils.toBean(cartStr, Cart.class)).
                collect(Collectors.toList());
        return list;
    }

    //合并未登录数据到登陆数据中
    public void addLocalCartToRedis(List<Cart> carts) {
        for (Cart cart : carts) {
            saveCart(cart);
        }
    }
}
